var combine = function(n, k) {
  const ans = [], path = [];

  backtracking(k, 1, ans, path, n)

  return ans;
};

function backtracking(k, i, ans, path, n) {
  if (path.length === k) {
    // js对数组的传递是传递的引用地址，也就是共享地址，所以需要对其进行拷贝[...path]
    ans.push([...path]);
    return;
  }


  // 优化：如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了，那么就没有必要搜索了
  for(let j = i; j <= n - (k - path.length) + 1; j++) {
    path.push(j)
    backtracking(k, j + 1, ans, path, n);
    path.pop();
  }
}


// 测试
const n = 4, k = 2;
console.log(combine(n, k))